/**
 * Copyright (c) 2020 Coder League
 * All rights reserved.
 *
 * File：FileUtil.java
 * History:
 *         2020年12月20日: Initially created, Chrise.
 */
package club.coderleague.cfss.util;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import org.springframework.web.multipart.MultipartFile;

import club.coderleague.cfss.domain.enums.FueCode;
import club.coderleague.cfss.exceptions.FileUploadException;

/**
 * 文件工具。
 * @author Chrise
 */
public class FileUtil {
	/**
	 * 保存系统配置文件。
	 * @author Chrise 2020年12月20日
	 * @param files 文件数据。
	 * @param saveRoot 保存目录。
	 * @throws Exception 保存错误。
	 */
	public static void saveSystemFiles(List<MultipartFile> files, String saveRoot) throws Exception {
		for (MultipartFile fi : files) {
			String name = fi.getOriginalFilename();
			String type = name.substring(name.lastIndexOf(".") + 1).toLowerCase();
			String ppath = saveRoot + "/" + name;
			File file = new File(saveRoot);
			
			//修改当前文件下的文件名
			if(file.exists()) {
				if(file.listFiles() != null) {
					for (File f : file.listFiles()) {
						if(f.isFile()) {
							//只修改未修改过的 且 类型相同的文件
							if(f.getName().indexOf("_lastupdate_") == -1) {
								String fname = f.getName();
								String ftype = fname.substring(fname.lastIndexOf(".") + 1).toLowerCase();
								if(type.equals(ftype)) {
									StringBuffer sb = new StringBuffer(f.getPath());
									String newfilename = sb.insert(f.getPath().lastIndexOf("."), "_lastupdate_" + + new Date().getTime()).toString();
									f.renameTo(new File(newfilename));
								}
							}
						}
					}
				}
			}
			
			// 检查是否存在, 不存在则创建目录。
			if(!file.exists()) file.mkdirs();
			// 生成文件。
			fi.transferTo(new File(ppath));
		}
	}
	
	/**
	 * 保存文件。
	 * @author Chrise 2020年12月27日
	 * @param file 文件。
	 * @param root 根目录。
	 * @param type 类型限制。
	 * @param size 大小限制。
	 * @return 保存路径。
	 * @throws Exception 保存错误。
	 */
	public static String saveFile(MultipartFile file, String root, String type, long size) throws Exception {
		if (file == null) throw new FileUploadException(FueCode.FILE_INVALID);
		
		String name = file.getOriginalFilename();
		if (name == null || "".equals(name)) throw new FileUploadException(FueCode.FILE_INVALID);
		
		String ftype = name.substring(name.lastIndexOf(".") + 1).toLowerCase();
		if (type.indexOf(ftype) == -1) throw new FileUploadException(FueCode.ILLEGAL_TYPE);
		
		if (file.getSize() > size) throw new FileUploadException(FueCode.TOO_BIG);
		
		String dpath = new SimpleDateFormat("/yyyy/MM/dd").format(new Date());
		String spath = dpath + "/" + UUID.randomUUID().toString() + "." + ftype;
		
		File dir = new File(root + dpath);
		if(!dir.exists()) dir.mkdirs();
		
		file.transferTo(new File(root + spath));
		
		return spath;
	}
	
	/**
	 * 保存文件。
	 * @author Chrise 2021年1月5日
	 * @param files 文件集合。
	 * @param root 根目录。
	 * @param type 类型限制。
	 * @param size 大小限制。
	 * @return 保存路径。
	 * @throws Exception 保存错误。
	 */
	public static List<String> saveFile(List<MultipartFile> files, String root, String type, long size) throws Exception {
		if (files == null || files.isEmpty()) throw new FileUploadException(FueCode.FILE_INVALID);
		
		List<String> spaths = new ArrayList<String>();
		for (MultipartFile file : files) {
			String spath = saveFile(file, root, type, size);
			spaths.add(spath);
		}
		return spaths;
	}
}
